#!/usr/bin/env.python
# _*_ coding:utf-8 _*_
# # # # # # # # # # # # # # # # # # # #
#  题目:      购物车序列化器             #
#  姓名:         李吉辉                #
#  时间:    2018年12月30日23:13:45     #
# # # # # # # # # # # # # # # # # # # #

from rest_framework import serializers

from goods.models import SKU


class CartSerializer(serializers.Serializer):
    """新增和修改购物车序列化器"""

    # 定义字段
    sku_id = serializers.IntegerField(label='商品 SKU ID', min_value=1)
    count = serializers.IntegerField(label='商品数量', min_value=1)
    selected = serializers.BooleanField(label='是否勾选', default=True)

    # 单独校验
    def validate_sku_id(self, value):
        """校验sku_id 有效性"""
        try:
            # 进行获取校验 判断是否存在
            SKU.objects.get(id=value)
        except SKU.DoesNotExist:
            #  不存在  抛出异常
            raise serializers.ValidationError('sku_id 不存在')
        # 返回
        return value


class CartSKUSerializer(serializers.ModelSerializer):
    """查询购物车序列化器"""
    count = serializers.IntegerField(label='商品数量', min_value=1)
    selected = serializers.BooleanField(label='是否勾选', default=True)

    # 元类(配置)
    class Meta:
        model = SKU  # 映射的模型
        # 序列器需要的字段
        fields = ['id', 'name', 'price', 'default_image_url', 'count', 'selected']


class CartDeleteSerializer(serializers.Serializer):
    """删除购物车序列化器"""
    sku_id = serializers.IntegerField(label='商品SKU ID', min_value=1)

    # 追加校验 (后执行) 在 is_valid之后
    def validate(self, attrs):
        """追加联合校验"""
        # attrs字典中获取 sku_id
        sku_id = attrs.get('sku_id')

        try:
            #  非法查询判断, 该sku_id是否存在于SKU对应的数据库表中
            SKU.objects.get(id=sku_id)
        except SKU.DoesNotExist:
            # sku_id 不存在抛出
            raise serializers.ValidationError('sku_id 不存在')
        # 返回
        return attrs


class CartSelectAllSerializer(serializers.Serializer):
    """全选购物车序列化器"""

    # 序列化字段              布尔类型      label是个接口看的
    selected = serializers.BooleanField(label='是否 全选')
